/**
 * 前端JS封装库，基于jquery和UMD规范
 * Created by hice on 2017/3/1.
 */
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD规范加载
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // Node, CommonJS规范加载
        module.exports = factory(require('jquery'));
    } else {
        // Browser globals (root is window)全局加载
        root.tools = factory(root.jQuery);
    }
}(this, function ($) {
    //定义
    var tools = tools || {};

    /**
     * 强制保留2位小数
     * @param amt IE5.5+才支持
     * @returns {*}
     */
    tools.float2 = function (amt) {
        if (isNaN(amt))
            return 0.00; //如果不是数字，返回0.00
        amt = Math.abs(amt); //取绝对值
        return (amt.toFixed(2)); //保留两位小数
    };

    /**
     * json对象转URL键值对
     * @param json
     * @returns {string}
     */
    tools.json2kv = function (json) {
        var kv = '';
        for (var key in json) {
            kv += key + '=' + json[key] + '&';
        }
        return kv;
    };

    /**
     * 根据关键字合并成特定格式数组
     * @param field 自动名称
     * @param newArray
     * @returns {Array}
     */
    tools.resetArrayByField = function (field, arr) {
        var newArray = [];
        for (var i = 0; i < arr.length; i++) {
            var item = {};
            for (var key in arr[i]) {
                if (key == field) {
                    item['id'] = arr[i][key];
                    item['data'] = arr[i];
                    newArray.push(item);
                }
            }
        }
        return newArray;
    };

    /**
     * 动态加载js文件css文件
     * tools.loadJsCss("http://libs.baidu.com/jquery/1.9.1/jquery.js","js")
     * @param fileurl 文件路径
     * @param filetype 文件类型，支持传入类型，js、css
     */
    tools.loadJsCss = function (fileUrl, fileType) {
        if (fileType == "js") {
            var file = document.createElement('script');
            file.setAttribute("type", "text/javascript");
            file.setAttribute("src", fileUrl);
        } else if (fileType == "css") {
            var file = document.createElement('link');
            file.setAttribute("rel", "stylesheet");
            file.setAttribute("type", "text/css");
            file.setAttribute("href", fileUrl);
        }
        if (typeof file != "undefined") {
            document.getElementsByTagName("head")[0].appendChild(file);
        } else {
            console.log("loadJsCss method error!");
        }
    };

    /*********************日期类**********************/

    /**
     * 获取当前时间戳
     * @param date
     * @returns {number}
     */
    tools.getTime = function (date) {
        return Math.floor(!!date ? date.getTime() / 1000 : new Date().getTime() / 1000);
    };

    /**
     * 日期补零
     * @param n
     * @returns {*}
     */
    tools.zeroFill = function (n) {
        n = n.toString();
        return n[1] ? n : '0' + n
    };

    /***************************浏览器************************/

    /**
     * 是否为安卓端
     * @returns {boolean}
     * @constructor
     */
    tools.Android = function () {
        if (/android/i.test(navigator.userAgent)) {
            return true;
        }
        return false;
    };

    /**
     * 是否是苹果端
     * @returns {boolean}
     * @constructor
     */
    tools.Ios = function () {
        if (/ipad|iphone/i.test(navigator.userAgent)) {
            return true;
        }
        return false;
    };

    /**
     * 【获取浏览器地址栏，某参数的值】
     * @param name
     * @returns {*}
     */
    tools.getURLParam = function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        //构造一个含有目标参数的正则表达式对象
        var r = window.location.search.substr(1).match(reg);
        //匹配目标参数
        if (r != null) return unescape(r[2]);
        return null;
    };

    /**
     * 给URL添加参数
     * @param json
     * @returns {string}
     */
    tools.addURLParams = function (json) {
        var url = "";
        if (json) {
            for (var item in json) {
                url += item + '=' + json[item] + '&';
            }
        }
        return encodeURIComponent(url);
    };

    /**
     * 替换或新增上级URL指定传入参数的值
     * @param params json数组
     * @private
     */
    tools.replaceReferrerParams = function (params, isHref) {
        var oUrl = document.referrer;
        for (var item in params) {
            if (oUrl.indexOf(item) > 0) {
                var re = eval('/(' + item + '=)([^&]*)/gi');
                oUrl = oUrl.replace(re, item + '=' + params[item]);
            } else {
                if (oUrl.indexOf('?') > 0) {
                    oUrl = oUrl + '&' + item + '=' + params[item];
                } else {
                    oUrl = oUrl + '?' + item + '=' + params[item];
                }
            }
        }
        if (!!isHref) {
            location.href = encodeURI(oUrl);
        }
    };

    /**
     * 【js动态创建form模拟提交表单list参数】
     * @param url
     * @param method
     * @param params
     */
    tools.submitList = function (url, method, params) {
        var turnForm = document.createElement("form");
        //一定要加入到body中！！
        document.body.appendChild(turnForm);
        //设置请求地址和方法
        turnForm.method = method;
        turnForm.action = url;
        turnForm.target = '';
        //创建隐藏表单
        for (var i = 0; i < params.length; i++) {
            var newElement = document.createElement("input");
            newElement.setAttribute("type", "hidden");
            newElement.setAttribute("name", params[i].paramName);
            newElement.setAttribute("value", params[i].paramValue);
            turnForm.appendChild(newElement);
        }
        // 提交
        turnForm.submit();
    };

    /**
     * 【js动态创建form模拟提交表单map参数】
     * @param  {[type]} url    [description]
     * @param  {[type]} method [description]
     * @param  {[type]} params [map对象Object {fileNumber="文件编号",fileName="文件名称"} ]
     * @return {[type]}        [description]
     */
    tools.submitMap = function (url, method, params) {
        var turnForm = document.createElement("form");
        //一定要加入到body中！！
        document.body.appendChild(turnForm);
        //设置请求地址和方法
        turnForm.method = method;
        turnForm.action = url;
        turnForm.target = "";
        //创建隐藏表单
        for (var key in params) {
            var newElement = document.createElement("input");
            newElement.setAttribute("type", "hidden");
            newElement.setAttribute("name", key);
            newElement.setAttribute("value", params[key]);
            turnForm.appendChild(newElement);
        }
        // 提交
        turnForm.submit();
    };

    /*************************日期、时间类封装处理********************/
    tools.date = {

        /**
         * JS判断闰年代码
         * @param y 年
         * @returns {boolean}
         */
        isLeapYear: function (y) {
            if (((y % 4) == 0) && ((y % 100) != 0) || ((y % 400) == 0)) {
                return true;
            } else {
                return false;
            }
        },

        /**
         * JS根据重新计算日期，返回正确日期
         * @param y 年
         * @param m 月
         * @param d 日
         * @returns {*[]}
         */
        resetDate: function (y, m, d) {
            var dd;
            if (m > 12) {
                m = m - 12;
                y++;
            }
            switch (m) {
                case 1:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 2:
                    dd = this.isLeapYear(y) ? (d > 29 ? 29 && m++ : d) : (d > 28 ? 28 && m++ : d);
                    break;
                case 3:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 4:
                    dd = d > 30 ? 30 && m++ : d;
                    break;
                case 5:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 6:
                    dd = d > 30 ? 30 && m++ : d;
                    break;
                case 7:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 8:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 9:
                    dd = d > 30 ? 30 && m++ : d;
                    break;
                case 10:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
                case 11:
                    dd = d > 30 ? 30 && m++ : d;
                    break;
                case 12:
                    dd = d > 31 ? 31 && m++ : d;
                    break;
            }
            return [y, m, d];
        },

        /**
         * 格式化当前时间，格式yyyy-MM-dd HH:mm:ss
         * @returns {string}
         */
        format: function () {
            var date = new Date();
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var day = date.getDate();
            var hour = date.getHours();
            var minute = date.getMinutes();
            var second = date.getSeconds();
            return [year, month, day].map(this.zeroFill).join('-') + ' ' + [hour, minute, second].map(this.zeroFill).join(':')
        },

        /**
         * 格式化当前日期yyyy-MM-dd
         * @param y
         * @param m
         * @param d
         * @returns {string}
         */
        formatDate: function (y, m, d) {
            var date = new Date();
            var year = date.getFullYear() * 1 + y;
            var month = date.getMonth() * 1 + (m + 1);
            var day = date.getDate() * 1 + d;
            var arr = this.resetDate(year, month, day);
            return arr.map(this.zeroFill).join('-');
        },

        /**
         * 格式化当前日期，月份增加
         * @param m
         * @returns {string}
         */
        formatDateAddMonth: function (m) {
            return this.formatDate(0, m, 0);
        }

    };

    /***********************storage***********************/
    tools.storage = {
        /**
         * 【保存本地sessino数据】
         * @param name
         * @param value
         */
        setSession: function (name, value) {
            window.sessionStorage.setItem(name, JSON.stringify(value));
        },

        /**
         * 【读取本地session数据】
         * @param name
         * @returns {*}
         */
        getSession: function (name) {
            var value = window.sessionStorage.getItem(name);
            value = !!value ? $.parseJSON(value) : null;
            return value;
        },

        /**
         * 【保存本地存储数据】
         * @param name
         * @param value
         */
        set: function (name, value) {
            window.localStorage.setItem(name, JSON.stringify(value));
        },

        /**
         * 【读取本地存储数据】
         * @param name
         * @returns {*}
         */
        get: function (name) {
            var value = window.localStorage.getItem(name);
            value = !!value ? $.parseJSON(value) : null;
            return value;
        }
    };

    /************************cookie************************/
    tools.cookie = {
        /**
         * 【读cookie】
         * @param name
         * @returns {*}
         */
        get: function (name) {
            var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
            if (arr = document.cookie.match(reg))
                return decodeURIComponent(arr[2]);
            else
                return null;
        },

        /**
         * 【写cookies】
         * @param name
         * @param value
         */
        set: function (name, value) {
            var exp = new Date();
            exp.setTime(exp.getTime() + 60 * 20000);//过期时间 20分钟
            document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + exp.toGMTString();
        },

        /**
         * 【移除cookie】
         * @param name
         */
        del: function (name) {
            var date = new Date();
            date.setTime(date.getTime() - 10000);
            document.cookie = name + "=a; expires=" + date.toGMTString();
        }
    };

    /************************缓存***************/
    tools.cache = {
        /**
         * 获取缓存
         * @param key 键名
         * @returns {*}
         * @constructor
         */
        get: function (key) {
            var res = JSON.parse(localStorage.getItem(key));
            if (!res) {
                return false;
            }
            if (!!!res.expressTime && res.expressTime < tools.getTime()) {
                localStorage.removeItem(key);
                return false;
            }
            return res.data;
        },

        /**
         * 设置缓存
         * @param key 键名
         * @param value 数据对象
         * @param endTime 过期时间
         * @returns {boolean}
         * @constructor
         */
        set: function (key, value, endTime) {
            if (key == '') {
                return false;
            }
            if (key && value == '') {
                return this.delete(key);
            }
            if (key && value != '') {
                var saveObj = {};
                saveObj['data'] = value;
                if (!!!endTime) {
                    saveObj['expressTime'] = tools.getTime() + endTime;
                }
                localStorage.setItem(key, JSON.stringify(saveObj));
                console.log('缓存成功' + key);
                return true;
            }
        },

        /**
         * 按分页顺序存放信息
         * @param key
         * @param value
         * @param pageNo
         * @returns {boolean}
         * @constructor
         */
        paging: function (key, value, pageNo, endTime) {
            var res = JSON.parse(localStorage.getItem(key));
            if (!res) {
                res = {data: [], expressTime: tools.getTime() + endTime};
            }
            if (res.constructor == Array && res.length < pageNo) {
                res.data[pageNo - 1] = new Array();
            }
            res.data[pageNo - 1] = value;
            this.set(key, res.data, res.expressTime);
        },

        /**
         * 更新数据对象
         * @param key
         * @param obj
         * @param time
         * @constructor
         */
        update: function (key, obj, time) {
            var res = JSON.parse(localStorage.getItem(key)), newDate;
            if (!res) {
                res = {data: [], expressTime: ''};
            }
            if (res.data instanceof Array) {
                res.data.length == 0 ? newDate = [] : newDate = res.data;
                newDate.push(obj);
            } else {
                obj = res.data;
                newDate = $.extend({}, obj);
            }
            this.set(key, newDate, time);
        },

        //清除缓存
        clear: function () {
            localStorage.clear();
        },

        //删除缓存
        delete: function (key) {
            localStorage.removeItem(key);
        },

        //获取所有缓存
        getAll: function () {
            var arr = new Array();
            for (var i = 0; i < localStorage.length; i++) {
                var key = localStorage.key(i);
                var res = JSON.parse(localStorage.getItem(localStorage.key(i)));
                if (res.expressTime < tools.getTime()) {
                    localStorage.removeItem(key);
                } else {
                    arr[key] = res.data;
                }
            }
            return arr;
        },

        //回收
        gc: function () {
            for (var i = 0; i < localStorage.length; i++) {
                var key = localStorage.key(i);
                var res = JSON.parse(localStorage.getItem(localStorage.key(i)));
                if (!!!res.expressTime && res.expressTime < tools.getTime()) {
                    localStorage.removeItem(key);
                }
            }
        },

        /**
         * 初始化
         * @param seconds 过期回收时间，传入回收精度,单位：秒
         * @constructor
         */
        init: function (seconds) {
            this.gc();
            setInterval(function () {
                this.gc();
            }, seconds * 1000);
        }
    };

    /***************匹配类******************/
    tools.pattern = {
        /**
         * 手机号格式判断
         * @param mobileNo
         * @returns {boolean}
         */
        isMobile: function (mobileNo) {
            if (/^1(3[0-9]|4[579]|5[0-9]|7[013678]|8[0-9])\d{8}$/.test(mobileNo) && mobileNo.length == 11) {
                return true;
            }
            return false;
        },
        /**
         * 用户密码匹配
         * @param password
         * @returns {boolean}
         */
        password: function (password) {
            var pattern = /([a-zA-Z0-9]|[*_#@%$&=+]){6,14}$/;
            if (pattern.test(password)) {
                return true;
            } else {
                return false;
            }
        },
        /**
         * 验证中文
         * @param  {[type]}  val [description]
         * @return {Boolean}     [description]
         */
        isChinese: function (val) {
            if (/^[\u4e00-\u9fa5],{0,}$/.test(val)) {
                return true;
            }
            return false;
        }
    };

    /**********************封装ajax请求*****************/
    tools.ajax = {
        /**
         * 默认和设置ajax请求前操作
         * @param func
         */
        before: function (func) {
            $.isFunction(func) ? func() : console.log('tools.ajax.before无函数！');
        },
        error: function (func) {
            $.isFunction(func) ? func() : console.log('tools.ajax.error无函数！');
        },
        complete: function (func) {
            $.isFunction(func) ? func() : console.log('tools.ajax.complete无函数！');
        },

        /**
         * 总方法
         * @param _url
         * @param _params
         * @param _isAsync
         * @param _before
         * @param _success
         * @param _error
         * @param _complete
         */
        post: function (_url, _params, _isAsync, _success, _error) {
            var self = this;
            $.ajax({
                type: 'POST',
                dataType: 'json',
                timeout: 30000,
                data: _params,
                url: _url,
                async: !!_isAsync ? true : false,
                beforeSend: function () {
                    self.before();
                },
                success: function (ret) {
                    $.isFunction(_success) && _success(ret);
                },
                error: function () {
                    $.isFunction(_error) ? _error() : self.error();
                },
                complete: function () {
                    self.complete();
                }
            });
        },

        /**
         * 同步
         * @param _url
         * @param _params
         * @param _before
         * @param _success
         * @param _error
         * @param _complete
         */
        sync: function (_url, _params, _success, _error) {
            tools.ajax.post(_url, _params, false, _success, _error)
        },
        async: function (_url, _params, _success, _error) {
            tools.ajax.post(_url, _params, true, _success, _error)
        }
    };

    /************************其他验证***************************/
    tools.pattern.other = {
        /**
         * 中石油卡号判断
         * @param card
         * @returns {boolean}
         */
        isZSYCardNo: function (card) {
            if (/^(9)\d{15}$/.test(card)) {
                return true;
            }
            return false;
        },

        /**
         * 中石化卡号判断
         * @param card
         * @returns {boolean}
         */
        isZSHCardNo: function (card) {
            if (/^(100011)\d{13}$/.test(card)) {
                return true;
            }
            return false;
        }
    };


    return tools;
}));